using UnityEngine;
using System.Collections;
using System.Collections.Generic;

namespace Perks{
	public class PerkSet{
		
		private int capacityPoints; public int GetCapacityPoints(){return this.capacityPoints;}
		private int availablePoints; public int GetAvailablePoints(){return this.availablePoints;}
		private List<Perk> equippedPerks;
		private List<string> auxPerksList;
		private AttributeSet attributeSet;
		
		public PerkSet(AttributeSet aSet){
			capacityPoints = 5;
			availablePoints = 5;
			equippedPerks = new List<Perk>();
			auxPerksList = new List<string>();
			attributeSet = aSet;
		}
		/// <summary>
		/// Equipa el perko y devuelve true si se pudo.
		/// Si el perk no está aprendido o no alcanzan los puntos devuelve false.
		/// </summary>
		/// <param name='perkName'>
		/// Nombre del Perk.
		/// </param>
		public bool Equip(string perkName){
			Perk perk = Perk.GetPerk(perkName);
			if (perk == null){
				Debug.LogWarning("El perk ("+ perkName +") no existe");
				return false;
			}
			if (equippedPerks.Contains(perk) ){
				Debug.LogWarning("Ya está equipado el Perk recampeón");
				return false;
			}
			Debug.Log(perk.GetCost());
			Debug.Log(availablePoints);
			Debug.Log(CheckRequirementsForEquip(perk) );
			if (perk.GetCost() <= availablePoints && CheckRequirementsForEquip(perk)){
				equippedPerks.Add(perk);
				perk.OnEquip(attributeSet);
				availablePoints-=perk.GetCost();
				//attributeSet.UpdateSubAttributesValue();
				AttributesController.GetInstance().UpdateStats();
				Debug.LogWarning("Perk: " + perk.GetName() + " equipped" );
				return true;
			}
			Debug.LogWarning("Can't Equip Perk");
			return false;
		}
		/// <summary>
		/// Desequipa el perko y devuelve true si se pudo.
		/// Si el perk no está equipado devuelve false.
		/// </summary>
		/// <param name='perkName'>
		/// Nombre del Perk.
		/// </param>
		public bool UnEquip(string perkName){
			Perk perk = Perk.GetPerk(perkName);
			if (!equippedPerks.Contains(perk) )
			 	return false;
			
			equippedPerks.Remove(perk);
			perk.OnUnEquip(attributeSet);
			availablePoints+=perk.GetCost();
			attributeSet.UpdateSubAttributesValue();
			AttributesController.GetInstance().UpdateStats();
			Debug.LogWarning("Perk: " + perk.GetName() + " UnEquipped" );
			return true;
		}
		/// <summary>
		/// Verifica si los requisitos de atributo se cumplen para equipar el perk.
		/// </summary>
		/// <returns>
		/// Devuelve true o false, según si cumple o no los requisitos.
		/// </returns>
		/// <param name='perk'>
		/// El perko que querés chequear si puede equiparse.
		/// </param>
		private bool CheckRequirementsForEquip(Perk perk){
			Debug.LogWarning("req: " + perk );
			if (perk.GetRequirements() == null)
				return true;
			foreach (RequirementPair reqsPair in perk.GetRequirements() ){
				if (attributeSet.GetAttributeTotalValue(reqsPair.baseAttribute)
					< reqsPair.requiredValue)
					return false;
			}
			return true;
		}
		public List<Perk> GetEquippedPerks(){ return equippedPerks;}
		public bool IsEquipped(string name)
		{
			if(equippedPerks.Contains(Perks.Perk.GetPerk(name)))
			{
				return true;
			}
			else
			{
				return false;
			}
		}
		public void RefreshPerks(){
			//Me guardo el nombre de los perks activados
			foreach(Perk perk in equippedPerks){
				auxPerksList.Add(perk.GetName() );
			}	
			//Los des-equipo a todos.
			UnEquipAllPerks();
			
			//Ahora los vuelvo a equipar.
			foreach(string perkName in auxPerksList){
				Equip(perkName);	
			}
			//Limpio la lista auxiliar de nombres.
			auxPerksList.Clear();
			
		}
		public void UnEquipAllPerks(){
			//Saco la cuenta de Perks de antemano
			int perksCount = equippedPerks.Count;
			//Desequipo siempre el primero porq la lista va cambiando.
			for (int i=0; i< perksCount; i++){
				UnEquip(equippedPerks[0].GetName() );	
			}
		}
	}
}